#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
using namespace std;

//1.终端获取信号，在进程中添加获取某个信号后的自定义方法
// static void func(int signalnum)
// {
//     cout << "进程获取信号：" << signalnum << " pid:" << getpid() << endl;
// }

// int main()
// {
//     signal(2,func);

//     while(true)
//     {
        
//         cout << "进程运行中 pid:" << getpid() << endl;
//         sleep(1);
//         int a = 0;
//         a /= 0;
//     }
// }

//父子进程 在信号中的运用 and coredump核心转储的取值方法
// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         while(true)
//         {
//             cout << "我是子进程,我的pid是:" << getpid() << endl;
//             sleep(2);
//             int a = 0;
//             a/=0;
//         }
//     }
//     //父进程
//     int status = 0;
//     waitpid(id,&status,0);
//     cout << "我是父进程,我的pid是:" << getpid() << " 子进程的退出信号为：" << (status & 0x7F) <<
//      " 子进程的coredump为:" << ((status>>7) & 1) << endl;
// }

//2.调用系统函数向进程发信号 kill
// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         while(true)
//         {
//             cout << "我是子进程,我的pid是:" << getpid() << endl;
//             sleep(1);
//             //raise(SIGQUIT);
//             //abort();
//         }
//     }
//     //父进程
//     sleep(2);
//     //kill(id,SIGINT);
//     int status = 0;
//     waitpid(id,&status,0);
//     cout << "我是父进程,我的pid是:" << getpid() << " 子进程的退出信号为：" << (status & 0x7F) << endl;
// }

//3.由软件条件产生信号
// static int count = 0;
// void call(int signalnum)
// {
//     cout << "count = " << count << endl;
//     //循环闹钟
//     alarm(1);
// }
// void back(int signalnum)
// {
//     cout << "退出循环加载程序，退出信号为：" << signalnum << " pid：" << getpid() << endl;
//     exit(0);
// }

// int main()
// {
//     //一秒的闹钟
//     alarm(1);
//     signal(14,call);
//     signal(2,back);

//     while(1) count++;
//     return 0;
// }

//4.由硬件异常产生的信号
void handler(int sig)
{
    cout << "sig:" << sig << endl;
}

int main()
{
    signal(8,handler);
    int a = 0;
    a /= 0;

    return 0;
}